home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 2
/
Nebula Two.iso
/
SourceCode
/
MiscKit1.7.1
/
MiscKit
/
Examples
/
SearchBench
/
Timer.m
< prev
Wrap
Text File
|
1993-10-21
|
7KB
|
205 lines
/*
* Copyright (c) 1993 Christopher J. Kane. All rights reserved.
*
* This software is subject to the terms of the MiscKit license
* agreement. Refer to the license document included with the
* MiscKit distribution for these terms.
*
* Version: 1.1 (22 October 1993)
*/
#import "Timer.h"
// Beware: this code is a mess
// The searchFor:... and replaceAll:... method implementations below
// have a few things of note:
// 1. A warmup timing is done, just for the sake of silliness
// 2. The state of the text that needs to be saved in order to
// restore it after timing the Text class is saved, so that
// the timing of the Misc_TBMK routines and friends happens
// under nearly the same conditions
// 3. Searches/replaces are done for the literal string of a
// regular expression in the Text object searching when a
// regular expression is provided.
#define WALLTIME(T1, T2) ((1000000*(T2.tv_sec-T1.tv_sec)+T2.tv_usec-T1.tv_usec)/1000)
#define PROCTIME(U1, U2) ((1000000*(U2.ru_utime.tv_sec-U1.ru_utime.tv_sec)+\
U2.ru_utime.tv_usec-U1.ru_utime.tv_usec+1000000*(U2.ru_stime.tv_sec-\
U1.ru_stime.tv_sec)+U2.ru_stime.tv_usec-U1.ru_stime.tv_usec)/1000)
@implementation Timer
- init
{
int i; // calibrate a bit
struct rusage usage1, usage2;
struct timeval t1, t2;
gettimeofday(&t1, 0); // just done for "warmup" purposes
getrusage(RUSAGE_SELF, &usage1);
[self self]; // get crude estimate of method call time
getrusage(RUSAGE_SELF, &usage2);
gettimeofday(&t2, 0);
wallcallms = 0;
proccallms = 0;
NXPing(); // why not?
for (i=0; i<25; i++)
{
gettimeofday(&t1, 0);
getrusage(RUSAGE_SELF, &usage1);
[self self];
getrusage(RUSAGE_SELF, &usage2);
gettimeofday(&t2, 0);
wallcallms += WALLTIME(t1, t2);
proccallms += PROCTIME(usage1, usage2);
}
wallcallms /= 25000;
proccallms /= 25000;
return self;
}
- (oneway void)makeSelectionVisible
{
[textObj makeSelectionVisible];
}
- (oneway void)replaceSelection:(const char *)replacement
{
[textObj replaceSelection:replacement];
}
- (oneway void)selectTextFrom:(int)start to:(int)end
{
[textObj selectTextFrom:start to:end];
}
- (void)writeSelectionToPasteboard:(in Pasteboard *)pboard asType:(in NXAtom)type
{
[textObj writeSelectionToPasteboard:pboard asType:type];
}
- (int)replaceAll:(const char *)pattern with:(const char *)replacement mode:(SearchMode)mode regexpr:(BOOL)regexpr cases:(BOOL)cases
{
char buffer[1024];
int r, count=0, end;
NXSelPt sp0, spN;
struct rusage usage1, usage2;
struct timeval t1, t2;
NXStream *strm;
strm = NXOpenMemory(NULL, 0, NX_READWRITE);
[textObj writeText:strm]; // save original text
NXSeek(strm, 0, NX_FROMSTART);
NXPing();
gettimeofday(&t1, 0); // just done for "warmup" purposes
getrusage(RUSAGE_SELF, &usage1);
[textObj self];
getrusage(RUSAGE_SELF, &usage2);
gettimeofday(&t2, 0);
[textObj getSel:&sp0 :&spN];
[messageField setStringValue:"Timing Text class..."];
[textObj getSel:&sp0 :&spN];
[[textObj window] disableDisplay]; // don't draw (and slow things down)
NXPing();
gettimeofday(&t1, 0); // time the Text class
getrusage(RUSAGE_SELF, &usage1);
if (mode==TextEdgeToTextEdge)
{
[textObj setSel:0 :0]; // start at the very beginning...
while ([textObj findText:pattern ignoreCase:!cases backwards:NO wrap:NO])
{ // findText:... does the selecting for us, and
// takes care of the end point
[textObj replaceSel:replacement];
count++;
}
}
else if (mode== SelStartToSelEnd)
{
end = spN.cp-strlen(pattern);
[textObj setSel:sp0.cp :sp0.cp];
while ([textObj findText:pattern ignoreCase:!cases backwards:NO wrap:NO])
{ // here, the we need to keep track of the end position
if (sp0.cp>end) break;
[textObj replaceSel:replacement];
end += strlen(replacement)-strlen(pattern);
count++;
}
}
getrusage(RUSAGE_SELF, &usage2);
gettimeofday(&t2, 0);
[[textObj window] reenableDisplay];
[[textObj window] display];
[textWallField setIntValue:WALLTIME(t1, t2)-wallcallms];
[textProcField setIntValue:PROCTIME(usage1, usage2)-proccallms];
[messageField setStringValue:"One moment..."];
NXPing();
[textObj readText:strm]; // restore original text
[textObj setSel:sp0.cp :spN.cp]; // restore original selection
[messageField setStringValue:"Timing Misc_TBMK routines..."];
NXPing();
gettimeofday(&t1, 0); // time the Misc_TBMK routines
getrusage(RUSAGE_SELF, &usage1);
r = [textObj replaceAll:pattern with:replacement mode:mode regexpr:regexpr cases:cases];
getrusage(RUSAGE_SELF, &usage2);
gettimeofday(&t2, 0);
[tbmkWallField setIntValue:WALLTIME(t1, t2)-wallcallms];
[tbmkProcField setIntValue:PROCTIME(usage1, usage2)-proccallms];
sprintf(buffer, "replaceAll:\"%s\" with:\"%s\" mode:%s regexpr:%s cases:%s", pattern, replacement,
(mode==TextEdgeToTextEdge?"TextEdgeToTextEdge":
mode==SelStartToSelEnd?"SelStartToSelEnd":"Other"),
(regexpr?"YES":"NO"), (cases?"YES":"NO"));
[messageField setStringValue:buffer];
NXCloseMemory(strm, NX_FREEBUFFER);
return r;
}
- (int)searchFor:(const char *)pattern mode:(SearchMode)mode reverse:(BOOL)rev regexpr:(BOOL)regexpr cases:(BOOL)cases position:(out int *)pos size:(out int *)size
{
char buffer[1024];
int r;
NXSelPt sp0, spN;
struct rusage usage1, usage2;
struct timeval t1, t2;
[textObj getSel:&sp0 :&spN];
NXPing();
gettimeofday(&t1, 0); // just done for "warmup" purposes
getrusage(RUSAGE_SELF, &usage1);
[textObj self];
getrusage(RUSAGE_SELF, &usage2);
gettimeofday(&t2, 0);
[messageField setStringValue:"Timing Text class..."];
NXPing();
gettimeofday(&t1, 0); // time the Text class
getrusage(RUSAGE_SELF, &usage1);
[textObj findText:pattern ignoreCase:!cases backwards:rev wrap:YES];
getrusage(RUSAGE_SELF, &usage2);
gettimeofday(&t2, 0);
[textWallField setIntValue:WALLTIME(t1, t2)-wallcallms];
[textProcField setIntValue:PROCTIME(usage1, usage2)-proccallms];
[textObj setSel:sp0.cp :spN.cp]; // restore original selection
[messageField setStringValue:"Timing Misc_TBMK routines..."];
NXPing();
gettimeofday(&t1, 0); // time the Misc_TBMK routines
getrusage(RUSAGE_SELF, &usage1);
r = [textObj searchFor:pattern mode:mode reverse:rev regexpr:regexpr cases:cases position:pos size:size];
getrusage(RUSAGE_SELF, &usage2);
gettimeofday(&t2, 0);
[tbmkWallField setIntValue:WALLTIME(t1, t2)-wallcallms];
[tbmkProcField setIntValue:PROCTIME(usage1, usage2)-proccallms];
sprintf(buffer, "searchFor:\"%s\" mode:%s reverse:%s regexpr:%s cases:%s pos:size:", pattern,
(mode==SelEndToSelStart?"SelEndToSelStart":
mode==SelStartToSelEnd?"SelStartToSelEnd":"Other"),
(rev?"YES":"NO"), (regexpr?"YES":"NO"), (cases?"YES":"NO"));
[messageField setStringValue:buffer];
return r;
}
@end